1 : <?php
2 : /*--------------------------------------------------------------------------+
3 : This file is part of eStudy.
4 : teams/classes/class.userteammanagement.inc.php
5 : - Modulgruppe: Teams
6 : - Beschreibung: Klasse zum Verwalten der Team-Zuordnungen der Teilnehmer.
7 : - Version: 0.3, 19/11/06
8 : - Autor(en): Clemens Weiß <clemens.weiss@mni.fh-giessen.de>
9 : +---------------------------------------------------------------------------+
10 : This program is free software; you can redistribute it and/or
11 : modify it under the terms of the GNU General Public License
12 : as published by the Free Software Foundation; either version 2
13 : of the License, or any later version.
14 : +---------------------------------------------------------------------------+
15 : This program is distributed in the hope that it will be useful,
16 : but WITHOUT ANY WARRANTY; without even the implied warranty of
17 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 : GNU General Public License for more details.
19 : You should have received a copy of the GNU General Public License
20 : along with this program; if not, write to the Free Software
21 : Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 : +--------------------------------------------------------------------------*/
23 : /**
24 : * Klasse zum Verwalten der Team-Zuordnungen der Teilnehmer.
25 : * @package eStudy.Teams
26 : * @version 0.3, 19/11/06
27 : * @author Clemens Weiß <clemens.weiss@mni.fh-giessen.de>
28 : */
29 1 : require_once ("class.teamlist.inc.php");
30 1 : require_once ("class.Course.inc.php");
31 1 : require_once ("class.userrolemanagement.inc.php");
32 1 : class UserTeamManagement {
33 : /**
34 : * ID des Kurses, für den die Team-Zuordnungen verwaltet werden sollen
35 : * @var int
36 : * @access private
37 : */
38 : var $courseID;
39 : /**
40 : * Array mit den Vor- und Nachnamen aller Kurs-Mitglieder
41 : * @var array
42 : * @access private
43 : */
44 : var $users;
45 : /**
46 : * Konstruktor
47 : * @access public
48 : * @param int $courseID ID des Kurses, für den die Team-Zuordnungen verwaltet werden sollen
49 : */
50 : function UserTeamManagement($courseID) {
51 0 : $this->courseID = (int)$courseID;
52 0 : $this->users = array();
53 0 : $users = Course::getParticipants($this->courseID, "all", "user.Nachname, user.Vorname");
54 0 : if (is_array($users)) {
55 0 : foreach($users as $user) {
56 0 : $this->users[(int)$user->userid] = "$user->lastname, $user->firstname";
57 0 : }
58 0 : }
59 0 : }
60 : /**
61 : * Gibt das Team-Objekt eines Benutzers zurück oder 0, falls der
62 : * Benutzer zu keinem Team gehört.
63 : *
64 : * @access public
65 : * @param int $userID ID des Benutzers
66 : * @return mixed Team-Objekt des Benutzers oder 0 oder false bei ungültiger User-ID
67 : */
68 : function getTeamOfUser($userID) {
69 0 : global $db, $settings;
70 0 : $dbp = $settings["dbPrefix"];
71 0 : if (strval(intval($userID)) != $userID || $userID <= 0) {
72 0 : return false;
73 : }
74 0 : $teamID = $db->get_var("SELECT team_id FROM {$dbp}user_team JOIN {$dbp}teams ON id=team_id WHERE user_id='$userID' AND course_id='$this->courseID'");
75 0 : if ($teamID > 0) {
76 0 : return new Team($teamID);
77 : }
78 0 : return 0;
79 : }
80 : /**
81 : * Gibt die User-IDs der Team-Mitglieder in einem Array zurück.
82 : *
83 : * @access public
84 : * @param int $teamID ID des Teams
85 : * @return mixed Array mit Integer-IDs oder false bei ungültiger Team-ID
86 : */
87 : function getUsersOfTeam($teamID) {
88 0 : global $db, $settings;
89 0 : $dbp = $settings["dbPrefix"];
90 0 : if (strval(intval($teamID)) != $teamID || $teamID <= 0) {
91 0 : return false;
92 : }
93 0 : $userIDs = $db->get_col("SELECT user_id FROM {$dbp}user_team JOIN {$dbp}user ON user_id=ID WHERE team_id='$teamID' ORDER BY Nachname, Vorname");
94 0 : if (is_array($userIDs)) {
95 0 : $userIDs = array_map("intval", $userIDs);
96 0 : return $userIDs;
97 : }
98 0 : return array();
99 : }
100 : /**
101 : * Listet alle Teams dieses Kurses inkl. der Mitglieder und freien Plätze auf.
102 : *
103 : * @access public
104 : * @return void
105 : */
106 : function listTeams() {
107 0 : global $db, $settings;
108 0 : $dbp = $settings["dbPrefix"];
109 0 : $urm = new UserRoleManagement($this->courseID);
110 0 : echo "<ul class='teamsOverview'>\n";
111 0 : foreach(TeamList::getTeams($this->courseID) as $team) {
112 0 : $userIDs = $this->getUsersOfTeam($team->getID());
113 0 : $available = $team->getMaxMembers() -count($userIDs);
114 0 : echo "<li>".Data::toHTML($team->getName(), false);
115 0 : if ($available == 1) {
116 0 : echo " (noch <strong>1</strong> freier Platz)";
117 0 : } elseif ($available > 0) {
118 0 : echo " (noch <strong>$available</strong> freie Plätze)";
119 0 : } elseif ($team->getMaxMembers() == 0) {
120 0 : echo " (noch <strong>beliebig viele</strong> freie Plätze)";
121 0 : } else {
122 0 : echo " (alle Plätze belegt)";
123 : }
124 0 : $teamID = (int)$team->getID();
125 0 : $crp = (int)$db->get_var("SELECT SUM(CrP) FROM user_team WHERE team_id='$teamID'");
126 0 : if ($crp > 0) {
127 0 : echo " <strong>$crp CrP </strong>" .
128 0 : "(entsprechen ", $crp * 30, " Arbeitsstunden)";
129 0 : }
130 0 : if (count($userIDs)) {
131 0 : echo "<ul>";
132 0 : foreach($userIDs as $userID) {
133 0 : $userCrp = (int)$db->get_var("SELECT CrP FROM {$dbp}user_team WHERE (user_id='$userID') AND (team_id='$teamID')");
134 0 : echo "<li>";
135 0 : if ($userCrp > 0) echo "$userCrp CrP ";
136 0 : echo "<a href='".PATH_TO_ROOT."user/homepage.php?user=$userID'>".Data::toHTML($this->users[$userID], false) ."</a>";
137 0 : if ($roles = $urm->getRolesOfUser((int)$userID, true)) {
138 0 : $gender = $db->get_var("SELECT gender FROM {$dbp}user WHERE ID='$userID'");
139 0 : $role = array_pop($roles);
140 0 : echo " (".$role["role"]->getPropertiesLink($role["role"]->getName($gender)) .")";
141 0 : }
142 : // Teamtermine eintragen
143 0 : $sql = "SELECT editCalendar FROM user_team WHERE user_id = ".Data::toMysql($userID) ." "."and team_id = ".Data::toMysql($team->getID());
144 0 : $resultList = $db->get_results($sql, ARRAY_A);
145 0 : if ($resultList != null) {
146 0 : $sql = "SELECT user_id FROM user_team WHERE user_id = ".Data::toMysql($_SESSION['userid']) ." "."and team_id = ".Data::toMysql($team->getID());
147 0 : $userList = $db->get_results($sql, ARRAY_A);
148 0 : if ($userList != null || $_SESSION['usergroup'] == DOZENT || $_SESSION['usergroup'] == ADMIN) {
149 0 : if ($resultList[0]['editCalendar'] == "1") {
150 0 : echo " (<a href=\"javascript:editNot(".$userID.",".$team->getID() .");\" title=\"Teamtermine nicht mehr editieren dürfen\">darf Teamtermine eintragen</a>)";
151 0 : } else {
152 0 : echo " (<a href=\"javascript:editDo(".$userID.",".$team->getID() .");\" title=\"Teamtermine editieren dürfen\">darf keine Teamtermine eintragen</a>)";
153 : }
154 0 : } else if ($userList == null && ($_SESSION['usergroup'] == DOZENT || $_SESSION['usergroup'] == ADMIN)) {
155 0 : if ($resultList[0]['editCalendar'] == "1") {
156 0 : echo " (darf Teamtermine eintragen)";
157 0 : } else {
158 0 : echo " (darf keine Teamtermine eintragen)";
159 : }
160 0 : }
161 0 : }
162 0 : echo "</li>\n";
163 0 : }
164 0 : echo "</ul>\n";
165 0 : }
166 0 : echo "</li>\n";
167 0 : }
168 0 : echo "</ul>";
169 0 : }
170 : /**
171 : * Zeigt das Formular an, mit dem sich der Benutzer selbst einem Team zuordnen kann oder
172 : * einen Hinweis, falls es keine Teams mit freien Plätzen mehr gibt.
173 : *
174 : * @access public
175 : * @return void
176 : */
177 : function showUserTeamForm() {
178 0 : $teams = TeamList::getTeams($this->courseID);
179 0 : if (count($teams)) {
180 0 : echo "<form action='".PATH_TO_ROOT.SCRIPT_NAME."' method='post'>"."<ul class='teamsOverview'>\n";
181 0 : $closingDate = TeamList::getTeamClosingDate($this->courseID);
182 0 : $time = time();
183 0 : if ($closingDate > $time) {
184 0 : echo "<li><input type='radio' name='team' id='team0' value='0' ".(!isset($_SESSION["teamID"]) ? "checked='checked' " : "") ."/> "."<label for='team0'><em>Kein Team</em></label>";
185 0 : }
186 0 : $count = 0;
187 0 : foreach($teams as $team) {
188 0 : $userIDs = $this->getUsersOfTeam($team->getID());
189 0 : $available = $team->getMaxMembers() -count($userIDs);
190 0 : if ($available > 0 || $team->getMaxMembers() == 0 || (in_array($_SESSION["userid"], $userIDs) && $closingDate > $time)) {
191 0 : echo "<li><input type='radio' name='team' id='team".$team->getID() ."' value='".$team->getID() ."' ".(isset($_SESSION["teamID"]) && $_SESSION["teamID"] == $team->getID() ? "checked='checked' " : "") ."/> "."<label for='team".$team->getID() ."'>".Data::toHTML($team->getName(), false) ."</label>";
192 0 : $count++;
193 0 : if (count($userIDs)) {
194 0 : echo "<ul>";
195 0 : foreach($userIDs as $userID) {
196 0 : echo "<li><a href='".PATH_TO_ROOT."user/homepage.php?user=$userID'>".Data::toHTML($this->users[$userID], false) ."</a></li>\n";
197 0 : }
198 0 : echo "</ul>\n";
199 0 : }
200 0 : echo "</li>\n";
201 0 : }
202 0 : }
203 0 : echo "</ul>\n";
204 0 : if ($count) {
205 0 : echo "<p class='pForm'><input type='submit' name='okButton' value='Speichern' /></p>";
206 0 : } else {
207 0 : echo "<p>Leider sind keine Plätze in Teams mehr frei.</p>";
208 : }
209 0 : echo "</form>";
210 0 : } else {
211 0 : echo "<p>Es wurden noch keine Teams angelegt.</p>";
212 : }
213 0 : }
214 : /**
215 : * Speichert eine Team-Zuordnung mit allen notwendigen Überprüfungen.
216 : * Wird 0 als Team-ID übergeben, wird die Team-Zugehörigkeit des Benutzers gelöscht.
217 : *
218 : * @access public
219 : * @param int $userID ID des Benutzers
220 : * @param int $teamID ID des Teams oder 0
221 : * @return mixed true bei Erfolg oder String mit Fehlermeldung
222 : */
223 : function setTeamForUser($userID, $teamID) {
224 0 : global $db, $settings, $EZSQL_ERROR;
225 0 : $dbp = $settings["dbPrefix"];
226 0 : if (strval(intval($userID)) != $userID || !in_array($userID, array_keys($this->users))) {
227 0 : return "Ungültige User-ID";
228 : }
229 0 : $teams = TeamList::getTeams($this->courseID);
230 0 : if ($teamID > 0) {
231 0 : if (strval(intval($teamID)) != $teamID || !in_array($teamID, array_keys($teams))) {
232 0 : return "Ungültige Team-ID";
233 : }
234 0 : if (TeamList::getTeamClosingDate($this->courseID) < time() && $this->getTeamOfUser($userID) !== 0) {
235 0 : return "Sie sind bereits Mitglied in einem Team.";
236 : }
237 0 : $team = new Team($teamID);
238 0 : if ($team->getMaxMembers() != 0 && count($this->getUsersOfTeam($teamID)) >= $team->getMaxMembers()) {
239 0 : return "In dem Team ist leider kein Platz mehr.";
240 : }
241 0 : }
242 0 : $errorCount = count($EZSQL_ERROR);
243 0 : $db->query("DELETE FROM {$dbp}user_team WHERE user_id='$userID' AND team_id IN (".implode(", ", array_keys($teams)) .")");
244 0 : if ($teamID > 0) {
245 0 : $db->query("INSERT INTO {$dbp}user_team (user_id, team_id) VALUES ('$userID', '$teamID')");
246 0 : }
247 0 : if (count($EZSQL_ERROR) > $errorCount) {
248 0 : return "Datenbank-Fehler";
249 : }
250 0 : return true;
251 : }
252 : /**
253 : * Gibt für jedes Team in diesem Kurs eine select-Box aus, in der
254 : * aus allen Kurs-Mitgliedern ausgewählt werden kann, wer dem Team zugeordnet ist.
255 : *
256 : * @access public
257 : * @return void
258 : */
259 : function showTeamAssignmentForms() {
260 0 : $size = count($this->users);
261 0 : if ($size > 8) $size = 8;
262 0 : foreach(TeamList::getTeams($this->courseID) as $team) {
263 0 : $userIDs = $this->getUsersOfTeam($team->getID());
264 0 : echo "<form action='".PATH_TO_ROOT.SCRIPT_NAME."' method='post' class='teamAssignmentForm'><p>\n"."<input type='hidden' name='teamID' value='".$team->getID() ."' />\n"."<strong>".Data::toHTML($team->getName(), false) ."</strong><br />\n"."<select name='users[]' size='$size' multiple='multiple'>\n";
265 0 : foreach($this->users as $userID => $userName) {
266 0 : echo "<option value='$userID'".(in_array($userID, $userIDs) ? " selected='selected'" : "") .">".Data::toHTML($userName, false) ."</option>\n";
267 0 : }
268 0 : echo "</select><br />"."<input type='submit' name='okButton' value='Speichern' /> "."<input type='reset' value='Auswahl zurücksetzen' />"."</p></form>\n";
269 0 : }
270 0 : }
271 : /**
272 : * Ordnet alle im Array angegebenen Benutzer-IDs dem angegebenen Team zu.
273 : * Bestehende Zuordnungen von Benutzern, die nicht im Array enthalten sind,
274 : * werden gelöscht.
275 : *
276 : * @access public
277 : * @param int $teamID ID des Teams, zu dem die Benutzer zugeordnet werden sollen
278 : * @param array $users Array von Benutzer-IDs, die dem Team zugeordnet werden sollen
279 : * @return mixed true bei Erfolg, sonst String mit Fehlermeldung
280 : */
281 : function assignUsersToTeam($teamID, $users) {
282 0 : global $db, $settings, $EZSQL_ERROR;
283 0 : $dbp = $settings["dbPrefix"];
284 0 : if (strval(intval($teamID)) != $teamID || $teamID <= 0 || !is_array($users)) {
285 0 : return "Ungültige Übergabe-Werte";
286 : }
287 0 : $users = array_map("intval", $users);
288 0 : if (count(array_diff($users, array_keys($this->users)))) {
289 0 : return "Einer der Benutzer ist nicht Mitglied dieses Kurses.";
290 : }
291 0 : $oldUsers = $this->getUsersOfTeam($teamID);
292 0 : $insert = array_diff($users, $oldUsers);
293 0 : $delete = array_diff($oldUsers, $users);
294 0 : $team = new Team($teamID);
295 0 : if ($team->getMaxMembers() > 0 && (count($oldUsers) +count($insert) -count($delete)) > $team->getMaxMembers()) {
296 0 : return "Die maximale Teilnehmerzahl dieses Teams beträgt ".$team->getMaxMembers();
297 : }
298 0 : foreach($insert as $userID) {
299 0 : if ($this->getTeamOfUser($userID) !== 0) {
300 0 : return "Der Benutzer ".$this->users[$userID]." ist bereits Mitglied in einem Team.";
301 : }
302 0 : }
303 0 : $errorCount = count($EZSQL_ERROR);
304 0 : if (count($insert)) {
305 0 : $db->query("INSERT INTO {$dbp}user_team (user_id, team_id) VALUES ('".implode("', '$teamID'), ('", $insert) ."', '$teamID')");
306 0 : }
307 0 : if (count($delete)) {
308 0 : $db->query("DELETE FROM {$dbp}user_team WHERE user_id IN (".implode(", ", $delete) .") AND team_id='$teamID'");
309 0 : }
310 0 : if (count($EZSQL_ERROR) > $errorCount) {
311 0 : return "Datenbank-Fehler";
312 : }
313 0 : return true;
314 : }
315 : /**
316 : * Gibt die IDs der Benutzer dieses Kurses zurück, die sich in ein Team einwählen können.
317 : * Das kann z.B. für die Prüfung von Zugriffsrechten verwendet werden.
318 : *
319 : * @access public
320 : * @return array Array mit User-IDs
321 : */
322 : function getUserIDs() {
323 0 : return array_keys($this->users);
324 : }
325 : }
|